import numpy as np

# 参数设置
lambda_arrival = 2  # 平均每单位时间到达的顾客数
mu_service = 2.5      # 平均每单位时间服务的顾客数
num_customers = 10  # 模拟的顾客数量
num_simulations = 1
average_waiting_times = np.zeros(num_simulations)
for sim in range(num_simulations):
    # 生成累积到达时间和服务时间.
    arrival_times = np.cumsum(np.random.exponential(1/lambda_arrival, num_customers))
    service_times = np.random.uniform(0.167,0.63, num_customers)
    # 初始化
    service_end_times = np.zeros(num_customers)
    waiting_times = np.zeros(num_customers)

    # 模拟排队过程
    for i in range(num_customers):
        # 第一个用户他的开始服务时间是到达时间。
        if i == 0:
            service_start_time = arrival_times[i]
        # 除了第一个用户外，其她人都需要考虑前一个用户的结束时间和自己的到达时间。
        else:
            # 服务开始的时间是取到达时间和结束时间的最大值。要么自己还得等，要么不用等。
            service_start_time = max(arrival_times[i], service_end_times[i-1])
        service_end_times[i] = service_start_time + service_times[i]
        waiting_times[i] = service_start_time - arrival_times[i]
    print('到达时间：',arrival_times)
    print('结束时间：',service_end_times)
    print('服务时间',service_times)
    print('等待时间:',waiting_times)
    average_waiting_times[sim] = np.mean(waiting_times)

# 计算平均等待时间
overall_average_waiting_time = np.mean(average_waiting_times)
print(f"所有模拟的平均等待时间: {overall_average_waiting_time:.2f} 时间单位")